//
//  main.cpp
//  vector_exercise
//
//  Created by 卜绎皓 on 2022/10/20.
//

#include<iostream>
#include<vector>
#include<string>
using namespace std;

void test_vector1()
{
    //插入数据
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);

    //遍历vector
    //1、operator[]
    for(size_t i = 0; i < v.size(); ++i)
    {
        v[i] -= 1;
        cout << v[i] << " ";
    }
    cout << endl;
    //2、迭代器
    vector<int>::iterator it = v.begin();
    while(it != v.end())
    {
        *it += 1;
        cout << *it << " ";
        ++it;
    }
    cout << endl;
    //3、范围for
    for(auto& e : v)
    {
        ++e;
        cout << e << " ";
    }
    cout << endl;
    
    //为什么有了vector,还要有string呢
    //vector里给char，虽然它们底层都是数组中存储char,但是还是不一样的
    //相比T是char的vector,s对象中指向的空间结尾有\0,这样符合很多规范,比如需要去玩strstr、strcpy等,而vector不能玩+=字符串等
    //所以说T是char的vector不能去替代string
    string s("111111");
    vector<char> vc(6, '1');

    //可以使用一段迭代器区间去构造,也可以控制这一段区间,且这里属于深拷贝(所有自己有独立空间的都要深拷贝)
    vector<int> v1(v.begin(), v.end());
    vector<int> v2(++v.begin(), --v.end());
    //可以使用其它容器的迭代器去构造,只要数据类型可以匹配上(*iterator对象的类型跟vector中存的数据类型是一致的)
    string s1("hello world");
    vector<char> v3(s1.begin(), s1.end());
    //vector<char*> v3(s1.begin(), s1.end());//err,无法从char转换到char*
    //怎么实现的？
    /*template<class InputIterator>
    vector(InputIterator first, InputIterator last)
    {
         while(first != last)
         {
             push_back(*first);
             ++first;
         }
    }*/

    //拷贝构造
    vector<int> v4(v);
}
int main()
{
    test_vector1();
    return 0;
}
